#include "mysig.h"


void (*signal2(int signo, void (*func)(int))) (int) {
    struct sigaction act, oact;
    act.sa_handler = func;
    sigemptyset(&act.sa_mask);
    act.sa_flags = 0;
    if (signo == SIGALRM) {
#ifdef SA_INTERRUPT
        act.sa_flags |= SA_INTERRUPT;
#endif
    } else {
#ifdef SA_RESTART
        act.sa_flags |= SA_RESTART; /* Hey here */
#endif
    }
    if (sigaction(signo, &act, &oact) < 0)
        return SIG_ERR;
    return oact.sa_handler;
}

void pr_mask(const char *str) {
    sigset_t sigset;
    // int      errno_save;
    // errno_save = errno; /* we can be called by signal handlers */
    if (sigprocmask(0, NULL, &sigset) < 0)
        printf("sigprocmask error\n");
    printf("%s\n", str);
    if (sigismember(&sigset, SIGINT))  printf("SIGINT ");
    if (sigismember(&sigset, SIGQUIT)) printf("SIGQUIT ");
    if (sigismember(&sigset, SIGUSR1)) printf("SIGUSR1 ");
    if (sigismember(&sigset, SIGUSR2)) printf("SIGUSR2 ");
    if (sigismember(&sigset, SIGALRM)) printf("SIGALRM ");
    /* remaining signals can go here */
    printf("\n");
    // errno = errno_save;
}

void err_sys(const char *str) {
    printf("%s\n", str);
}
